#ifndef RWLOCK_PTHREAD_H
#define RWLOCK_PTHREAD_H

#include <pthread.h>
/* 基于 pthread 实现的读写锁 */
/* 读写锁是一种多线程同步机制，允许多个线程同时对共享资源进行读操作，但只允许一个线程对共享资源进行写操作。 */

#ifdef __cplusplus
extern "C" {
#endif


typedef struct {
    pthread_mutex_t mutex;        // 互斥锁
    pthread_cond_t read_cond;     // 读者条件变量
    pthread_cond_t write_cond;    // 写者条件变量
    int reader_count;             // 当前读者数量
    int writer_count;             // 当前写者数量
    pthread_t owner_thread;       // 当前写锁拥有者线程ID
    int lock_count;               // 锁计数
    int initialized;             // 是否被初始化
    int destroyed;               // 是否被销毁
} rwlock_t;

#define RWLOCK_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0, 0, 0, 0, 0}

/* 读写锁初始化 */
void rwlock_init(rwlock_t *lock);
/* 读写锁销毁 */
void rwlock_destroy(rwlock_t *lock);
/* 读写锁的读取锁加锁 */
void rwlock_lock_read(rwlock_t *lock);
/* 读写锁的读取锁解锁 */
void rwlock_unlock_read(rwlock_t *lock);
/* 读写锁的写入锁加锁 */
void rwlock_lock_write(rwlock_t *lock);
/* 读写锁的写入锁解锁 */
void rwlock_unlock_write(rwlock_t *lock);

#ifdef __cplusplus
}
#endif

#endif // RWLOCK_PTHREAD_H